package com.alibaba.japan.club.runtime.springmvc.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 统一的父过滤器,所有的自定义过滤器都要继承该类
 * 
 * @author:shaochuan.wangsc
 * @date:2009-3-24
 * 
 */
public abstract class JapanAbstractFilter implements Filter {

	private FilterConfig filterConfig;

	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;
	}

	/**
	 * 初始化filter。
	 * 
	 * @throws ServletException 如果初始化失败
	 */
	public void init() throws ServletException {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
			ServletException {
		// 在weblogic中，servlet forward时，仍会调用此filter
		if (!(request instanceof HttpServletRequest && response instanceof HttpServletResponse)
				|| (request.getAttribute(getClass().getName()) != null)) {
			chain.doFilter(request, response);
			return;
		}
		// 防止重入.
		request.setAttribute(getClass().getName(), Boolean.TRUE);

		// 执行子类的doFilter
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		doFilter(req, res, chain);
	}

	/**
	 * 执行filter.
	 * 
	 * @param request HTTP请求
	 * @param response HTTP响应
	 * @param chain filter链
	 * 
	 * @throws IOException 处理filter链时发生输入输出错误
	 * @throws ServletException 处理filter链时发生的一般错误
	 */
	public abstract void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
			throws IOException, ServletException;

	/**
	 * 清除filter.
	 */
	public void destroy() {
		filterConfig = null;
	}

	/**
	 * 取得filter的配置信息。
	 * 
	 * @return <code>FilterConfig</code>对象
	 */
	public FilterConfig getFilterConfig() {
		return filterConfig;
	}

	/**
	 * 取得servlet容器的上下文信息。
	 * 
	 * @return <code>ServletContext</code>对象
	 */
	public ServletContext getServletContext() {
		return getFilterConfig().getServletContext();
	}

	/**
	 * 查找指定的filter初始化参数，按如下顺序：
	 * 
	 * <ol>
	 * <li>
	 * 查找filter自身的<code>init-param</code></li>
	 * <li>
	 * 查找web应用全局的<code>init-param</code></li>
	 * <li>
	 * 使用指定默认值。</li>
	 * </ol>
	 * 
	 * 
	 * @param paramName 初始化参数名
	 * @param defaultValue 默认值
	 * 
	 * @return 指定名称所对应的初始化参数值，如果未定义或参数值为空，则返回<code>null</code>。
	 */
	public String findInitParameter(String paramName, String defaultValue) {
		// 取filter参数
		String value = trimToNull(getFilterConfig().getInitParameter(paramName));
		// 如果未取到，则取全局参数
		if (value == null) {
			value = trimToNull(getServletContext().getInitParameter(paramName));
		}
		// 如果未取到，则取默认值
		if (value == null) {
			value = defaultValue;
		}
		return value;
	}

	/**
	 * 将字符串trim，如果字符串为空白，则返回<code>null</code>。
	 * 
	 * @param str 输入字符串
	 * 
	 * @return 输出字符串，如果输入字符串为空白，则返回<code>null</code>
	 */
	public String trimToNull(String str) {
		if (str != null) {
			str = str.trim();
			if (str.length() == 0) {
				str = null;
			}
		}
		return str;
	}
}
